From f0d14d7fdbf4a9ea2d02989230d15577670092c7 Mon Sep 17 00:00:00 2001 From: Dietmar Hahn Date: Thu, 9 Feb 2012 06:08:02 -0800 Subject: [PATCH] vpmu: Use macros to access struct vpmu_struct.flags This patch introduces some macros realising the access to the item 'flags' in the struct vpmu_struct (see xen/include/asm-x86/hvm/vpmu.h). Only bits within 'flags' are set/reset/checked. Signed-off-by: Dietmar Hahn Committed-by: Keir Fraser --- xen/arch/x86/hvm/svm/vpmu.c | 30 ++++++++++++------------- xen/arch/x86/hvm/vmx/vpmu_core2.c | 32 +++++++++++++-------------- xen/arch/x86/hvm/vpmu.c | 4 ++-- xen/arch/x86/oprofile/nmi_int.c | 4 ++-- xen/arch/x86/oprofile/op_model_ppro.c | 10 ++++----- xen/include/asm-x86/hvm/vpmu.h | 6 +++++ 6 files changed, 46 insertions(+), 40 deletions(-) diff --git a/xen/arch/x86/hvm/svm/vpmu.c b/xen/arch/x86/hvm/svm/vpmu.c index 1a69249ca4..ee8064c926 100644 --- a/xen/arch/x86/hvm/svm/vpmu.c +++ b/xen/arch/x86/hvm/svm/vpmu.c @@ -188,8 +188,8 @@ static void amd_vpmu_restore(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); struct amd_vpmu_context *ctxt = vpmu->context; - if ( !((vpmu->flags & VPMU_CONTEXT_ALLOCATED) && - (vpmu->flags & VPMU_RUNNING)) ) + if ( !(vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) && + vpmu_is_set(vpmu, VPMU_RUNNING)) ) return; context_restore(v); @@ -214,8 +214,8 @@ static void amd_vpmu_save(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); struct amd_vpmu_context *ctx = vpmu->context; - if ( !((vpmu->flags & VPMU_CONTEXT_ALLOCATED) && - (vpmu->flags & VPMU_RUNNING)) ) + if ( !(vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) && + vpmu_is_set(vpmu, VPMU_RUNNING)) ) return; context_save(v); @@ -261,20 +261,20 @@ static int amd_vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content) /* check if the first counter is enabled */ if ( (get_pmu_reg_type(msr) == MSR_TYPE_CTRL) && - is_pmu_enabled(msr_content) && !(vpmu->flags & VPMU_RUNNING) ) + is_pmu_enabled(msr_content) && !vpmu_is_set(vpmu, VPMU_RUNNING) ) { if ( !acquire_pmu_ownership(PMU_OWNER_HVM) ) return 1; - vpmu->flags |= VPMU_RUNNING; + vpmu_set(vpmu, VPMU_RUNNING); apic_write(APIC_LVTPC, PMU_APIC_VECTOR); } /* stop saving & restore if guest stops first counter */ - if ( (get_pmu_reg_type(msr) == MSR_TYPE_CTRL) && - (is_pmu_enabled(msr_content) == 0) && (vpmu->flags & VPMU_RUNNING) ) + if ( (get_pmu_reg_type(msr) == MSR_TYPE_CTRL) && + (is_pmu_enabled(msr_content) == 0) && vpmu_is_set(vpmu, VPMU_RUNNING) ) { apic_write(APIC_LVTPC, PMU_APIC_VECTOR | APIC_LVT_MASKED); - vpmu->flags &= ~VPMU_RUNNING; + vpmu_reset(vpmu, VPMU_RUNNING); release_pmu_ownship(PMU_OWNER_HVM); } @@ -298,7 +298,7 @@ static void amd_vpmu_initialise(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); uint8_t family = current_cpu_data.x86; - if ( vpmu->flags & VPMU_CONTEXT_ALLOCATED ) + if ( vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) return; if ( counters == NULL ) @@ -333,22 +333,22 @@ static void amd_vpmu_initialise(struct vcpu *v) } vpmu->context = (void *)ctxt; - vpmu->flags |= VPMU_CONTEXT_ALLOCATED; + vpmu_set(vpmu, VPMU_CONTEXT_ALLOCATED); } static void amd_vpmu_destroy(struct vcpu *v) { struct vpmu_struct *vpmu = vcpu_vpmu(v); - if ( !(vpmu->flags & VPMU_CONTEXT_ALLOCATED) ) + if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) return; xfree(vpmu->context); - vpmu->flags &= ~VPMU_CONTEXT_ALLOCATED; + vpmu_reset(vpmu, VPMU_CONTEXT_ALLOCATED); - if ( vpmu->flags & VPMU_RUNNING ) + if ( vpmu_is_set(vpmu, VPMU_RUNNING) ) { - vpmu->flags &= ~VPMU_RUNNING; + vpmu_reset(vpmu, VPMU_RUNNING); release_pmu_ownship(PMU_OWNER_HVM); } } diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c b/xen/arch/x86/hvm/vmx/vpmu_core2.c index 7412dc8bcd..ba1bd9da24 100644 --- a/xen/arch/x86/hvm/vmx/vpmu_core2.c +++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c @@ -266,17 +266,17 @@ static void core2_vpmu_save(struct vcpu *v) { struct vpmu_struct *vpmu = vcpu_vpmu(v); - if ( !((vpmu->flags & VPMU_CONTEXT_ALLOCATED) && - (vpmu->flags & VPMU_CONTEXT_LOADED)) ) + if ( !(vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) && + vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED)) ) return; __core2_vpmu_save(v); /* Unset PMU MSR bitmap to trap lazy load. */ - if ( !(vpmu->flags & VPMU_RUNNING) && cpu_has_vmx_msr_bitmap ) + if ( !vpmu_is_set(vpmu, VPMU_RUNNING) && cpu_has_vmx_msr_bitmap ) core2_vpmu_unset_msr_bitmap(v->arch.hvm_vmx.msr_bitmap); - vpmu->flags &= ~VPMU_CONTEXT_LOADED; + vpmu_reset(vpmu, VPMU_CONTEXT_LOADED); return; } @@ -303,11 +303,11 @@ static void core2_vpmu_load(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); /* Only when PMU is counting, we load PMU context immediately. */ - if ( !((vpmu->flags & VPMU_CONTEXT_ALLOCATED) && - (vpmu->flags & VPMU_RUNNING)) ) + if ( !(vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) && + vpmu_is_set(vpmu, VPMU_RUNNING)) ) return; __core2_vpmu_load(v); - vpmu->flags |= VPMU_CONTEXT_LOADED; + vpmu_set(vpmu, VPMU_CONTEXT_LOADED); } static int core2_vpmu_alloc_resource(struct vcpu *v) @@ -373,17 +373,17 @@ static int core2_vpmu_msr_common_check(u32 msr_index, int *type, int *index) if ( !is_core2_vpmu_msr(msr_index, type, index) ) return 0; - if ( unlikely(!(vpmu->flags & VPMU_CONTEXT_ALLOCATED)) && + if ( unlikely(!vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED)) && (vpmu->context != NULL || !core2_vpmu_alloc_resource(current)) ) return 0; - vpmu->flags |= VPMU_CONTEXT_ALLOCATED; + vpmu_set(vpmu, VPMU_CONTEXT_ALLOCATED); /* Do the lazy load staff. */ - if ( !(vpmu->flags & VPMU_CONTEXT_LOADED) ) + if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) ) { __core2_vpmu_load(current); - vpmu->flags |= VPMU_CONTEXT_LOADED; + vpmu_set(vpmu, VPMU_CONTEXT_LOADED); if ( cpu_has_vmx_msr_bitmap ) core2_vpmu_set_msr_bitmap(current->arch.hvm_vmx.msr_bitmap); } @@ -467,12 +467,12 @@ static int core2_vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content) for ( i = 0; i < core2_get_pmc_count(); i++ ) pmu_enable |= core2_vpmu_cxt->pmu_enable->arch_pmc_enable[i]; if ( pmu_enable ) - vpmu->flags |= VPMU_RUNNING; + vpmu_set(vpmu, VPMU_RUNNING); else - vpmu->flags &= ~VPMU_RUNNING; + vpmu_reset(vpmu, VPMU_RUNNING); /* Setup LVTPC in local apic */ - if ( vpmu->flags & VPMU_RUNNING && + if ( vpmu_is_set(vpmu, VPMU_RUNNING) && is_vlapic_lvtpc_enabled(vcpu_vlapic(v)) ) apic_write_around(APIC_LVTPC, PMU_APIC_VECTOR); else @@ -588,14 +588,14 @@ static void core2_vpmu_destroy(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); struct core2_vpmu_context *core2_vpmu_cxt = vpmu->context; - if ( !(vpmu->flags & VPMU_CONTEXT_ALLOCATED) ) + if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) return; xfree(core2_vpmu_cxt->pmu_enable); xfree(vpmu->context); if ( cpu_has_vmx_msr_bitmap ) core2_vpmu_unset_msr_bitmap(v->arch.hvm_vmx.msr_bitmap); release_pmu_ownship(PMU_OWNER_HVM); - vpmu->flags &= ~VPMU_CONTEXT_ALLOCATED; + vpmu_reset(vpmu, VPMU_CONTEXT_ALLOCATED); } struct arch_vpmu_ops core2_vpmu_ops = { diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c index bae6eedcf4..1c52aad9c6 100644 --- a/xen/arch/x86/hvm/vpmu.c +++ b/xen/arch/x86/hvm/vpmu.c @@ -86,7 +86,7 @@ void vpmu_initialise(struct vcpu *v) if ( !opt_vpmu_enabled ) return; - if ( vpmu->flags & VPMU_CONTEXT_ALLOCATED ) + if ( vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) vpmu_destroy(v); switch ( vendor ) @@ -110,7 +110,7 @@ void vpmu_initialise(struct vcpu *v) if ( vpmu->arch_vpmu_ops != NULL ) { - vpmu->flags = 0; + vpmu_clear(vpmu); vpmu->context = NULL; vpmu->arch_vpmu_ops->arch_vpmu_initialise(v); } diff --git a/xen/arch/x86/oprofile/nmi_int.c b/xen/arch/x86/oprofile/nmi_int.c index a58a0e9892..dacaca3e6f 100644 --- a/xen/arch/x86/oprofile/nmi_int.c +++ b/xen/arch/x86/oprofile/nmi_int.c @@ -47,7 +47,7 @@ static int passive_domain_msr_op_checks(unsigned int msr, int *typep, int *index if ( !model->is_arch_pmu_msr(msr, typep, indexp) ) return 0; - if ( !(vpmu->flags & PASSIVE_DOMAIN_ALLOCATED) ) + if ( !vpmu_is_set(vpmu, PASSIVE_DOMAIN_ALLOCATED) ) if ( ! model->allocated_msr(current) ) return 0; return 1; @@ -78,7 +78,7 @@ int passive_domain_do_wrmsr(unsigned int msr, uint64_t msr_content) void passive_domain_destroy(struct vcpu *v) { struct vpmu_struct *vpmu = vcpu_vpmu(v); - if ( vpmu->flags & PASSIVE_DOMAIN_ALLOCATED ) + if ( vpmu_is_set(vpmu, PASSIVE_DOMAIN_ALLOCATED) ) model->free_msr(v); } diff --git a/xen/arch/x86/oprofile/op_model_ppro.c b/xen/arch/x86/oprofile/op_model_ppro.c index e56e5370ba..e2aa859b3e 100644 --- a/xen/arch/x86/oprofile/op_model_ppro.c +++ b/xen/arch/x86/oprofile/op_model_ppro.c @@ -143,7 +143,7 @@ static int ppro_check_ctrs(unsigned int const cpu, xenoprof_log_event(current, regs, eip, mode, i); wrmsrl(msrs->counters[i].addr, -reset_value[i]); if ( is_passive(current->domain) && (mode != 2) && - (vcpu_vpmu(current)->flags & PASSIVE_DOMAIN_ALLOCATED) ) + vpmu_is_set(vcpu_vpmu(current), PASSIVE_DOMAIN_ALLOCATED) ) { if ( IS_ACTIVE(msrs_content[i].control) ) { @@ -230,8 +230,8 @@ static int ppro_allocate_msr(struct vcpu *v) if ( !msr_content ) goto out; vpmu->context = (void *)msr_content; - vpmu->flags = 0; - vpmu->flags |= PASSIVE_DOMAIN_ALLOCATED; + vpmu_clear(vpmu); + vpmu_set(vpmu, PASSIVE_DOMAIN_ALLOCATED); return 1; out: gdprintk(XENLOG_WARNING, "Insufficient memory for oprofile, oprofile is " @@ -244,10 +244,10 @@ static void ppro_free_msr(struct vcpu *v) { struct vpmu_struct *vpmu = vcpu_vpmu(v); - if ( !(vpmu->flags & PASSIVE_DOMAIN_ALLOCATED) ) + if ( !vpmu_is_set(vpmu, PASSIVE_DOMAIN_ALLOCATED) ) return; xfree(vpmu->context); - vpmu->flags &= ~PASSIVE_DOMAIN_ALLOCATED; + vpmu_reset(vpmu, PASSIVE_DOMAIN_ALLOCATED); } static void ppro_load_msr(struct vcpu *v, int type, int index, u64 *msr_content) diff --git a/xen/include/asm-x86/hvm/vpmu.h b/xen/include/asm-x86/hvm/vpmu.h index d08bbc6214..6ba420ed63 100644 --- a/xen/include/asm-x86/hvm/vpmu.h +++ b/xen/include/asm-x86/hvm/vpmu.h @@ -69,6 +69,12 @@ struct vpmu_struct { #define VPMU_CONTEXT_LOADED 0x2 #define VPMU_RUNNING 0x4 #define PASSIVE_DOMAIN_ALLOCATED 0x8 + +#define vpmu_set(_vpmu, _x) ((_vpmu)->flags |= (_x)) +#define vpmu_reset(_vpmu, _x) ((_vpmu)->flags &= ~(_x)) +#define vpmu_is_set(_vpmu, _x) ((_vpmu)->flags & (_x)) +#define vpmu_clear(_vpmu) ((_vpmu)->flags = 0) + int vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content); int vpmu_do_rdmsr(unsigned int msr, uint64_t *msr_content); int vpmu_do_interrupt(struct cpu_user_regs *regs); -- 2.30.2